package util;

import java.io.ByteArrayInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Clase que obtiene el c�digo hash o de resumen de un cadena
 * @author rbueno
 *
 */
public class MD5 
{
    /**
     * Metodo que genera el hash MD5 
     * @param data Cadena de la cual queremos calcular el hash MD5
     * @param key Clave que emplearemos en el calculo del hash.
     * @return Un array de bits con el valor resultante del hash 
    */
    public static byte[] getHashMD5(String data, String key) 
    {
    	try
        {  
            //Generamos un objeto MessageDigest que implementa el algoritmo MD5
            //esto puede lanzar una NoSuchAlgorithmException si el algoritmo
            //no est� soportado. Pero se supone que esto no debe ocurrir
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] textBytes = data.getBytes(); //raw-bytes del texto de entrada 
            //Actulizamos el digest
            md5.update(textBytes);
            //En ocasiones se quiere aplicar una clave al algoritmo, esto
            //se consigue actualizando el digest con los bytes de la clave
            //Esto se utiliza por ejemplo en el m�todo de autentificaci�n
            //APOP de POP3 en el que a una marca de tiempo (timestamp)
            //se le aplica el algorimto MD5 con la contrase?a de usuario
            //como clave.
            //En el protocolo MSN el m�todo de autentificaci�n es similar
            //Realmente obtendremos el mismo resultado si concatenamos
            //los datos y la clave y asumimos la clave como una
            //cadena de longitud cero. Esto se puede comprobar en el ejemplo del main()
            byte[] result =  md5.digest();
            
            return result;
        }
        catch(NoSuchAlgorithmException e)
        {
            //esto ocurre si el algoritmo MD5 no est� soportado
            return null;
        }
    }
    
     /**
     * Convierte un byte[] a un String con su valor equivalente en hexadecimal
     * De gran utilidad para convertir el hash calculado con getHashMD5 
      * a hexadecimal
     * @param datos
     * @return
     */
    public static String toHexadecimal(byte[] datos) 
    { 
        String resultado = "";
        ByteArrayInputStream input = new ByteArrayInputStream(datos);
        String cadAux;
        int leido = input.read();
        while (leido != -1)
        {
            cadAux = Integer.toHexString(leido);
            if (cadAux.length() < 2) //Hay que a�adir un 0 
            {
                resultado += "0";
            }
            resultado += cadAux;
            leido = input.read();
        }
        return resultado; 
    }
}

